// PART OF THE MACHINE SIMULATION. DO NOT CHANGE.

package nachos.machine;

import nachos.machine.*;

/**
 * 虚拟页面和物理页面之间的映射
 */
public final class TranslationEntry {
    /**
     * 分配一个新的无效映射条目
     */
    public TranslationEntry() {
        valid = false;
    }

    /**
     * 分配具有指定初始状态的新映射条目
     *
     * @param vpn      虚拟页号
     * @param ppn      物理页号
     * @param valid    是否有效
     * @param readOnly 是否只读
     * @param used     是否被使用
     * @param dirty    是否被修改
     */
    public TranslationEntry(int vpn, int ppn, boolean valid, boolean readOnly,
                            boolean used, boolean dirty) {
        this.vpn = vpn;
        this.ppn = ppn;
        this.valid = valid;
        this.readOnly = readOnly;
        this.used = used;
        this.dirty = dirty;
    }

    /**
     * 分配新的映射条目，复制现有条目的内容
     *
     * @param entry 要复制的映射条目
     */
    public TranslationEntry(TranslationEntry entry) {
        vpn = entry.vpn;
        ppn = entry.ppn;
        valid = entry.valid;
        readOnly = entry.readOnly;
        used = entry.used;
        dirty = entry.dirty;
    }

    /**
     * 虚拟页号
     */
    public int vpn;

    /**
     * 物理页号
     */
    public int ppn;

    /**
     * 如果此标志为 false，则忽略此映射条目
     */
    public boolean valid;

    /**
     * 如果此标志为 true，则不允许用户程序修改此虚拟页面的内容
     */
    public boolean readOnly;

    /**
     * 每次用户程序读取或写入页面时，此标志设置为 true
     */
    public boolean used;

    /**
     * 每次用户程序写入页面时，此标志都设置为 true
     */
    public boolean dirty;
}
